#include "literal.h"
#include <stdio.h>
#include "expresion.h"
#include "abcyp.h"
#include "parser.h"

#define VAR "x"




int main(int argc, char* argv[]) {
	TPila pila;
  TExpresion expr,destino,destino2,destino3;
	//TLiteral literal;
	char* string;
  int error;
  char* prueba=(char*)malloc(sizeof(char)*100);
  FILE* Arch,*Arch2;

  Arch=fopen("Pruebas.txt","r");
  Arch2=fopen("Derivadas.txt","wt");


  while (!feof(Arch)){
    fscanf(Arch,"%s",prueba);
//  }


  printf("Formula a derivar: %s\n",prueba);
  fprintf(Arch2,"Formula a derivar: %s\n",prueba);

	P_Crear(&pila, sizeof(TLiteral));

  error=infijo_a_sufijo(prueba,"x",&pila);
  if (error!=1){
    printf("Error en TDA LITERAL: %d",error);
    fprintf(Arch2,"Error en TDA LITERAL: %d",error);
    //return 0;
    goto algo;
  }
  P_Vaciar(&pila);


	Expresion_Crear (&expr);

	Expresion_Parsear (&expr, prueba, VAR);

//recorrer_AB(&expr,"RAIZ");


  error=Expresion_Simplificar(&expr,&destino);
  if(error!=1){
    if(error==-3){
      fprintf(stderr,"MA Error\n");
      fprintf(Arch2,"MA Error\n\n");
    }
    Expresion_Destruir(&expr);
    printf("Error en la primera etapa de simplificar: %d",error);
    //return 0;
    goto algo;
  }

//recorrer_AB(&destino,"RAIZ");





	Expresion_Derivar(&destino,&destino2);

printf("Derivo\n");
	Expresion_AString (&destino2, &string);
	printf("Formula derivada: %s\n",string);
	free(string);


  error=Expresion_Simplificar(&destino2,&destino3);
  if(error!=1){
    if(error==-3){
      fprintf(stderr,"MA Error\n");
      fprintf(Arch2,"MA Error\n\n");
    }
    printf("ERROR: %d\n",error);
    Expresion_Destruir(&expr);
    return 0;
  }
	Expresion_AString (&destino3, &string);
	printf("Formula derivada y simplificada: %s\n",string);
	fprintf(Arch2,"Formula derivada y simplificada: %s\n\n",string);
	free(string);

  Expresion_Destruir (&expr);
  Expresion_Destruir (&destino);
  Expresion_Destruir (&destino2);
  Expresion_Destruir (&destino3);

  algo:
  if (error!=1) printf("se produjo un error\n");

}

  free(prueba);
  fclose(Arch);
  fclose(Arch2);
	return 0;
}

